package ongd.web;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import ongd.negocio.gestion.ControladorProyectoSC;
import ongd.negocio.gestion.Proyecto;
import ongd.negocio.gestion.Subvencion;
import ongd.servicios.persistencia.exceptions.PreexistingEntityException;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;

/**
 * Clase que se encargará de insertar una subvención.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@ManagedBean
@ViewScoped
public class Insertar_Subvencion extends ABean {

    /**
     * Objeto de tipo ControladorProyectoSC que nos servirá para realizar 
     * las operaciones necesarias de los proyectos.
     */
    private ControladorProyectoSC contProy;
    /**
     * Objeto de tipo Subvención que corresponderá con la nueva subvención que
     * vamos a crear.
     */
    private Subvencion subvencion;
    /**
     * Objeto de tipo List que va a contener proyectos que serán asociados al
     * nuevo apadrinado.
     */
    private List<Proyecto> proyectos;
    /**
     * Booleano que dependiendo de su valor nos indicará si vamos a insertar
     * una subvención directamente en la base de datos.
     */
    private boolean insertarSubvencion;
    /**
     * Objeto de tipo String que corresponderá con el nombre del proyecto
     * al que asociaremos el apadrinado.
     */
    private String nombreProyecto;
    /**
     * Objeto de tipo String que va a contener el título de la página donde
     * estemos.
     */
    private String titulo;

    /** 
     * Constructor de la clase.
     */
    public Insertar_Subvencion() {
        subvencion = new Subvencion();
        proyectos = new ArrayList<Proyecto>();
    }

    /**
     * Método que carga las variables según el tipo de acceso que hayamos 
     * realizado a la página. 
     */
    @Override
    public void cargaInicial() {
        nombreProyecto = null;
        //Buscamos los nombres de proyectos existentes
        if (!FacesContext.getCurrentInstance().isPostback()) {
            SesionBean sesion = getSesionBean();
            if (sesion.iniciadaSesion()) {
                contProy = sesion.getControladorProyectoSC();
                if (sesion.getStrVariable().compareTo("siC") == 0) {
                    titulo = "Insertar - Nueva Subvención Cooperación";
                    insertarSubvencion = true;
                    proyectos = contProy.buscarProyectosTipo("C");
                } else if (sesion.getStrVariable().compareTo("siS") == 0) {
                    titulo = "Insertar - Nueva Subvención Sensibilización";
                    insertarSubvencion = true;
                    proyectos = contProy.buscarProyectosTipo("S");
                } else {
                    insertarSubvencion = false;
                }
            }
        }
    }

    /**
     * Método que sube un archivo adjunto a la aplicación.
     * @param event Fichero a subir
     */
    public void subirAdjunto(FileUploadEvent event) {
        try {
            String nombre;
            SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
            nombre = sdf.format(new Date()) + "_" + event.getFile().getFileName();
            getSesionBean().guardar(nombre, event.getFile().getInputstream());
            subvencion.setDocumentoAdjunto(nombre);
        } catch (IOException ex) {
            Logger.getLogger(Insertar_Subvencion.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Método que guarda una subvención.
     * @return null.
     */
    public String guardarSubvencion() {
        if (getSesionBean().iniciadaSesion()) {
            RequestContext requestContext = RequestContext.getCurrentInstance();
            if (insertarSubvencion) {
                if (proyectos != null) {
                    try {
                        Proyecto p = contProy.buscarProyecto(nombreProyecto);
                        if (contProy.guardarSubvencion(subvencion, p)) {
                            requestContext.addCallbackParam("finOK", true);
                            subvencion = new Subvencion();
                        } else {
                            requestContext.addCallbackParam("noCreado", true);
                        }
                    } catch (PreexistingEntityException ex) {
                        Logger.getLogger(Insertar_Subvencion.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (Exception ex) {
                        Logger.getLogger(Insertar_Subvencion.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } else {
                    //Si no hemos elegido un proyecto salta un mensaje de error
                    requestContext.addCallbackParam("faltaProy", true);
                }
            } else {
                //Hemos llamado al metodo desde insertar proyecto, asique le guardamos en una lista
                contProy.guardarSubvencionLista(subvencion);
                requestContext.addCallbackParam("listaOK", true);
                subvencion = new Subvencion();
            }
        }
        return null;
    }

    /**
     * Método que devuelve la lista de nombres de los proyectos a los que 
     * puede pertenecer la subvención.
     * @return lista de nombres.
     */
    public List<String> getAvailableP() {
        if (proyectos != null) {
            List<String> availableP = new ArrayList<String>();
            for (Proyecto p : proyectos) {
                availableP.add(p.getNombre());
            }
            return availableP;
        }
        return null;
    }

    /**
     * Método que devuelve el valor de la variable que nos indica si estamos 
     * insertando una subvención directamente.
     * @return true, si vamos a insertar directamente y false, si la vamos a 
     * introducir en una auxiliar.
     */
    public boolean isInsertarSubvencion() {
        return insertarSubvencion;
    }

    /**
     * Método que devuelve la subvención con la que estamos trabajando.
     * @return subvención.
     * @see #setSubvencion
     */
    public Subvencion getSubvencion() {
        return subvencion;
    }

    /**
     * Método que establece el valor de la variable insertarSubvencion.
     * @param insertarSubvencion Nuevo valor de la variable
     */
    public void setInsertarSubvencion(boolean insertarSubvencion) {
        this.insertarSubvencion = insertarSubvencion;
    }

    /**
     * Método que asigna un nuevo nombre del proyecto.
     * @param nombreProyecto nuevo nombre. 
     * @see #getNombreProyecto
     */
    public void setNombreProyecto(String nombreProyecto) {
        this.nombreProyecto = nombreProyecto;
    }

    /**
     * Método que asigna un nuevo valor a la subvención.
     * @param subvencion nueva subvención. 
     * @see #getSubvencion
     */
    public void setSubvencion(Subvencion subvencion) {
        this.subvencion = subvencion;
    }

    /**
     * Método que devuelve el nombre de un proyecto.
     * @return nombre del proyecto.
     * @see #setNombreProyecto
     */
    public String getNombreProyecto() {
        return nombreProyecto;
    }

    /**
     * Método que devuelve la lista de proyectos a los que puede pertenecer la subvención.
     * @return lista de proyectos.
     * @see #setProyectos
     */
    public List<Proyecto> getProyectos() {
        return proyectos;
    }

    /**
     * Método que da un nuevo valor a la lista de proyectos.
     * @param proyectos nueva lista. 
     * @see #getProyectos
     */
    public void setProyectos(List<Proyecto> proyectos) {
        this.proyectos = proyectos;
    }

    /**
     * Método que devuelve el controlador de proyecto.
     * @return controlador de proyecto.
     * @see #setContProy
     */
    public ControladorProyectoSC getContProy() {
        return contProy;
    }

    /**
     * Método que asigna un nuevo valor al controlador de proyectos.
     * @param contProy nuevo controlador. 
     * @see #getContProy
     */
    public void setContProy(ControladorProyectoSC contProy) {
        this.contProy = contProy;
    }

    /**
     * Método que devuelve el valor de la variable titulo.
     * @return titulo
     * @see #setTitulo
     */
    public String getTitulo() {
        return titulo;
    }

    /**
     * Método que establece el valor de la variable título.
     * @param titulo Nuevo valor de la variable
     * @see #getTitulo
     */
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
}
